var express = require('express');
var router = express.Router();
var sql = require('./../sql')
var User = require('./../sql/col/users')
var md5 = require('md5')
var uuid = require('node-uuid')
var jwt = require('jsonwebtoken')
var { validateToken } = require('./../utils')

/* GET users listing. */
router.get('/', function(req, res, next) {
  res.send('用户相关接口');
});

/**
 * @api {get} api/users/getuserinfo 获取用户信息
 * @apiDescription 获取用户信息
 * @apiGroup user
 * @apiParam { string } userid 用户id
 * @apiParam { string } token登陆令牌
 * @apiSuccessExample { json } Success-Response:
 *  {
 *    code : '1908110' ,
 *    message : 'token验证失败' ,
 *  }
 *  {
 *    code : '200' ,
 *    message : '获取用户信息' ,
 *    data:data[0]
 *  }
 * @apiSampleRequest /api/users/getuserinfo
 * @apiVersion 1.0.0
 */

router.get('/getuserinfo',(req,res,next) => {
  validateToken(req).then(()=>{
    const { userid } = req.query
    sql.find(User,{userid},{_id:0}).then(data=>{
      res.send({
        code:'200',
        message:'获取用户信息',
        data:data[0]
      })
    }).catch(()=>{
      res.send({
        code:'1908110',
        message : 'token验证失败'
      })
    })
  })
})

/**
 * @api {post} api/users/updateuserinfo 更改用户信息
 * @apiDescription 更改用户信息
 * @apiGroup user
 * @apiParam { string } userid 用户id
 * @apiParam { string } token 登陆令牌
 * @apiParam { string } nickname 昵称
 * @apiParam { number } sex 性别
 * @apiParam { string } date 出生日期
 * @apiSuccessExample { json } Success-Response:
 *  {
 *    code : '1908110' ,
 *    message : 'token验证失败' ,
 *  }
 *  {
 *    code : '200' ,
 *    message : '更改成功' ,
 *  }
 * @apiSampleRequest /api/users/updateuserinfo
 * @apiVersion 1.0.0
 */

router.post('/updateuserinfo',(req,res,next) => {
  validateToken(req).then(()=>{
    let { userid, nickname, sex, date } = req.body
    nickname = nickname || ''
    sex = sex*1
    date = date || ''
    sql.update(User,{userid},{$set:{nickname, sex, date}}).then(()=>{
      res.send({
        code:'200',
        message:'更改成功'
      })
    }).catch(()=>{
      res.send({
        code:'1908110',
        message : 'token验证失败'
      })
    })
  })
})

/**
 * @api {post} api/users/updateavatar 更改用户头像
 * @apiDescription 更改用户头像
 * @apiGroup user
 * @apiParam { string } userid 用户id
 * @apiParam { string } token 登陆令牌
 * @apiParam { string } avatar 头像
 * @apiSuccessExample { json } Success-Response:
 *  {
 *    code : '1908110' ,
 *    message : 'token验证失败' ,
 *  }
 *  {
 *    code : '200' ,
 *    message : '更改成功' ,
 *  }
 * @apiSampleRequest /api/users/updateavatar
 * @apiVersion 1.0.0
 */
router.post('/updateavatar',(req,res,next) => {
  validateToken(req).then(()=>{
    let { userid, avatar } = req.body
    sql.update(User,{userid},{$set:{avatar}}).then(()=>{
      res.send({
        code:'200',
        message:'更改成功'
      })
    }).catch(()=>{
      res.send({
        code:'1908110',
        message : 'token验证失败'
      })
    })
  })
})


/**
 * @api {post} api/users/register 注册用户
 * @apiDescription 注册用户
 * @apiGroup user
 * @apiParam { string } tel 手机号
 * @apiParam { string } password 密码
 * @apiSuccessExample { json } Success-Response:
 *  {
 *    code : '600' ,
 *    message : '手机号或密码为空，请完善表单信息' ,
 *  }
 *  {
 *    code : '601' ,
 *    message : '该用户已存在' ,
 *  }
 *  {
 *    code : '200' ,
 *    message : '注册成功' ,
 *  }
 * @apiSampleRequest /api/users/register
 * @apiVersion 1.0.0
 */
router.post('/register', (req, res, next) => {
  // 获取手机/密码
  let { tel, password } = req.body
  // 去除首尾空格
  tel = tel.trim()
  password = password.trim()
  // 判断数据是否为空
  // 当为空时，直接返回
  if ( !tel || !password ) { 
    res.send({
      code: '600',
      msssage: '用户名或密码为空，请完善表单信息'
    })
    return
  } else {
    // 判断用户是否存在
    sql.find(User, { tel }, { _id:0 }).then(data => {
      if (data.length === 0) {
        // 密码加密
        password = md5(password)
        // 封装用户信息
        const userObj = {
          userid: 'user_' + uuid.v1(),
          tel, 
          password,
          nickname: '请设置昵称', // 默认为请设置用户名
          sex: -1, // -1未知
          avator: '', // 头像空字符串
          email: '', // 邮箱空字符串
          vip: 0 // 新建用户无vip
        }
        sql.insert(User, userObj).then(() => {
          res.send({
            code: '200',
            message: '用户注册成功'
          })
        })
      } else {
        res.send({
          code : '601' ,
          message: '该用户已存在'
        })
      }
    })
  }
})

/**
 * @api {post} api/users/login 用户登录
 * @apiDescription 用户登录
 * @apiGroup user
 * @apiParam { string } tel 手机号
 * @apiParam { string } password 密码
 * @apiSuccessExample { json } Success-Response:
 *  {
 *    code : '600' ,
 *    message : '手机号或密码为空，请完善表单信息' ,
 *  }
 *  {
 *    code : '602' ,
 *    message : '该用户未注册' ,
 *  }
 *  {
 *    code : '603' ,
 *    message : '密码不正确' ,
 *  }
 * {
 *    code : '200',
 *    message : '登录成功',
 * }
 * @apiSampleRequest /api/users/login
 * @apiVersion 1.0.0
 */
router.post('/login', (req, res, next) => {
  // 获取手机/密码
  let { tel, password } = req.body
  // 去除空格
  tel = tel.trim()
  password = password.trim()
  // 判断是否为空
  if ( !tel || !password ) {
    res.send({
      code: '600',
      msssage: '用户名或密码为空，请完善表单信息'
    })
    return
  } else {
    // 根据手机号查询数据库 , 看用户是否未注册
    sql.find(User, { tel }, { _id: 0 }).then(data => {
      // 未注册
      if (data.length === 0) {
        res.send({
          code : '602' ,
          message: '该用户未注册'
        }) 
      } else {
        // 密码加密
        password = md5(password)
        sql.find(User, { tel, password }, { _id: 0 }).then(data2 => {
          // 密码不正确
          if (data2.length === 0) {
            res.send({
              code: '603',
              message: '密码不正确'
            })
          } else {
            let token = jwt.sign({ tel, password }, 'OurVue', {
              expiresIn : 7*24*60*60  // 默认7天免登录
            })
            res.send({
              code: '200',
              message: '登录成功',
              data: {
                userid: data2[0].userid,
                nickname: data2[0].nickname,
                sex: data2[0].sex,
                avatar: data2[0].avatar,
                date: data2[0].date,
                tel: data2[0].tel,
                token
              }
            })
          }
        })
      }
    })
  }
})

module.exports = router;
